import { _decorator, Component, Node, UITransform, Vec3 } from 'cc';
import { Logger } from '../utils/logger';
const { ccclass, property } = _decorator;

/**
 * UI组件基类
 * 所有UI组件都应该继承此类
 */
@ccclass('BaseUI')
export class BaseUI extends Component {
    /** 日志管理器 */
    protected logger: Logger = new Logger();

    /** 组件名称 */
    protected componentName: string = 'BaseUI';

    /** 是否已初始化 */
    private isInitialized: boolean = false;

    /**
     * 生命周期：加载时
     */
    protected override onLoad(): void {
        this.logger.debug(`[${this.componentName}] Component loading`);
        if (!this.isInitialized) {
            this.initialize();
            this.isInitialized = true;
        }
    }

    /**
     * 生命周期：启用时
     */
    protected override onEnable(): void {
        this.logger.debug(`[${this.componentName}] Component enabled`);
        this.registerTouchEvents();
    }

    /**
     * 生命周期：禁用时
     */
    protected override onDisable(): void {
        this.logger.debug(`[${this.componentName}] Component disabled`);
        this.unregisterTouchEvents();
    }

    /**
     * 生命周期：销毁时
     */
    protected override onDestroy(): void {
        this.logger.debug(`[${this.componentName}] Component destroyed`);
        this.cleanup();
    }

    /**
     * 初始化组件
     * 子类应该重写此方法以进行自定义初始化
     */
    protected initialize(): void {
        this.logger.debug(`[${this.componentName}] Initializing component`);
    }

    /**
     * 注册触摸事件
     * 子类应该重写此方法以注册自己的触摸事件
     */
    protected registerTouchEvents(): void {
        this.logger.debug(`[${this.componentName}] Registering touch events`);
    }

    /**
     * 注销触摸事件
     * 子类应该重写此方法以注销自己的触摸事件
     */
    protected unregisterTouchEvents(): void {
        this.logger.debug(`[${this.componentName}] Unregistering touch events`);
    }

    /**
     * 清理组件资源
     * 子类应该重写此方法以清理自己的资源
     */
    protected cleanup(): void {
        this.logger.debug(`[${this.componentName}] Cleaning up component`);
    }

    /**
     * 显示组件
     */
    public show(): void {
        this.node.active = true;
        this.logger.debug(`[${this.componentName}] Component shown`);
    }

    /**
     * 隐藏组件
     */
    public hide(): void {
        this.node.active = false;
        this.logger.debug(`[${this.componentName}] Component hidden`);
    }

    /**
     * 设置组件位置
     * @param position 位置向量
     */
    public setPosition(position: Vec3): void {
        this.node.position = position;
    }

    /**
     * 设置组件大小
     * @param width 宽度
     * @param height 高度
     */
    public setSize(width: number, height: number): void {
        const transform = this.getComponent(UITransform);
        if (transform) {
            transform.width = width;
            transform.height = height;
        }
    }
} 